perm filename XLITER.FAI[XGP,BGB] blob
sn#029409 filedate 1973-05-11 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00007 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE XLIT - TRANSLITERATE TEXT
C00007 00003 XLITER FILE READ, DO XLITERATION.
C00013 00004 NSUBR(GETCHR)INPUT A CHARACTER
C00015 00005 NSUBR(GETFIL)GET FILE SPEC FROM TTY LINE
C00017 00006 NSUBR(SEARCH,KEY,TABLE,SIZE)SEARCH HASH TABLE
C00018 00007 DATA AREA
C00019 ENDMK
C⊗;
TITLE XLIT - TRANSLITERATE TEXT
ACCUMULATORS{CHR,PTR,CNT,T1,T2,LAST,ACCUM,FOO}
↓INCHAN←14
↓OUTCHAN←15
XLTSIZ←=503 ;NICE PRIME(?) NUMBER
START: MOVE P,[IOWD PLEN,PDL]
OUTSTR[ASCIZ/
TRANSLITERATION FILE: /]
CALL(GETFIL)
CALLI 12
INIT INCHAN,
SIXBIT/DSK/
INHDR
FATAL(CAN'T INIT DSK)
LOOKUP INCHAN,FILNAM
GO [ SKIPE EXTION
GO XLTNFD
MOVSI 1,'XLT'
MOVEM 1,EXTION
LOOKUP INCHAN,FILNAM
GO [XLTNFD: OUTSTR[ASCIZ/FILE NOT FOUND./]
GO START]
GO XLTOK]
XLTOK: SETZM XLTABLE
MOVE [XWD XLTABLE,XLTABLE+1]
BLT XLTEND
SETZM XLTFNT
MOVEI 1
MOVEM ESCFNT
L0: MOVEI READY
MOVEM INEOF
CALL(TVTEST)
CALL(GETCHR)
; CAIN CHR,"C"
; GO [ CALL(GETCHR)
; CAIN CHR,"O"
; GO [ MOVEI [FATAL(NULL FILE)]
; MOVEM INEOF
; CALL(GETCHR)
; CAIE CHR,14
; GO $.-2
; GO L0 ]
; MOVEM CHR,ESC2
; MOVEI CHR,"C"
; MOVEM CHR,ESC1
; GO L0A ]
MOVEM CHR,ESC1
CALL(GETCHR)
MOVEM CHR,ESC2
CALL(GETCHR)
MOVEM CHR,ESC3
CALL(GETCHR)
MOVEM CHR,ESC4
CALL(GETCHR)
CAIE CHR,15
L0A: GO [ FATAL(ESCAPE CHARACTERS ARE FOUR SINGLE CHARACTERS FOLLOWED BY
CRLF. SEE XLITER.DOC FOR DETAILS) ]
CALL(GETCHR)
CAIE CHR,12
GO L0A
L1A: CALL(GETCHR)
L1: MOVEI CNT,5
SETZM FROMLIT
MOVE T1,[POINT 7,FROMLIT]
MOVEM T1,FROMPTR#
L2: JUMPE CHR,[CALL(GETCHR)↔GO L2]
IDPB CHR,FROMPTR
CALL(GETCHR)
CAIN CHR,"≡"
GO [ CALL(GETCHR)
GO L2A ]
CAIN CHR,"→"
GO L3A
L2A: SOJG CNT,L2
FATAL(TRANSLITERATION LONGER THAN 5 CHARACTERS)
L3A: CALL(GETCHR)
L3: MOVEI CNT,5
SETZM TOLIT
MOVE PTR,[POINT 7,TOLIT]
L4: CAIN CHR,"≡"
GO [ CALL(GETCHR)
GO L4A ]
CAIN CHR,15
CALL(GETCHR)
CAIN CHR,12
GO L5
JUMPE CHR,L4
L4A: IDPB CHR,PTR
CALL(GETCHR)
SOJG CNT,L4
FATAL(TRANSLITERATION LONGER THAN 5 CHARACTERS)
L5: CALL(SEARCH,FROMLIT,[XLTABLE],[XLTSIZ])
GO L6 ;FAILURE
SKIPE XLTVAL(1)
GO [ MOVE T1,TOLIT
CAMN T1,XLTVAL(1)
GO [ OUTSTR[ASCIZ/DUPLICATE DECLARATION '/]
OUTSTR FROMLIT
OUTSTR[ASCIZ/'→'/]
OUTSTR TOLIT
OUTSTR[ASCIZ/'
/]↔ GO L1A]
OUTSTR[ASCIZ/ATTEMPT TO REDEFINE '/]
OUTSTR FROMLIT
OUTSTR[ASCIZ/'→'/]
OUTSTR XLTVAL(1)
OUTSTR[ASCIZ/' AS '/]
OUTSTR TOLIT
OUTSTR[ASCIZ/'
/]↔ GO L1A]
L6: MOVE T1,FROMLIT
MOVEM T1,XLTABLE(1)
MOVE T1,TOLIT
MOVEM T1,XLTVAL(1)
SETZB T1,TOLIT
DPB T1,FROMPTR
MOVSI PTR,(<7B5>)
ADDB PTR,FROMPTR
CAMN PTR,[POINT 7,FROMLIT]
GO L1A
CALL(SEARCH,FROMLIT,[XLTABLE],[XLTSIZ])
GO L6
GO L1A
;XLITER FILE READ, DO XLITERATION.
READY: OUTSTR[ASCIZ/
INPUT FILE: /]
CALL(GETFIL)
GO .-2
LOOKUP INCHAN,FILNAM
GO [ OUTSTR[ASCIZ/FILE NOT FOUND./]
GO READY]
READY2: OUTSTR[ASCIZ/OUTPUT FILE: /]
CALL(GETFIL)
GO .-2
INIT OUTCHAN,
SIXBIT/DSK/
XWD OUTHDR,0
FATAL(CAN'T INIT DSK)
ENTER OUTCHAN,FILNAM
GO [ OUTSTR[ASCIZ/FILE IN USE OR PROTECTED.
/]↔ GO READY2]
SETZM CURFNT
MOVEI FINISH
MOVEM INEOF
CALL(TVTEST)
R1A: CALL(GETCHR)
R1: JUMPE CHR,R1A
CAMN CHR,ESC1
GO [ CALL(SELFNT,ESCFNT)
SETZM ACCUM
X1: CALL(GETCHR)
JUMPE CHR,$.-1
CAMN CHR,ESC3
GO [ CALL(GETCHR)
GO X2 ]
CAMN CHR,ESC2
GO R1A
CAMN CHR,ESC4
GO [ CALL(GETCHR)
CAIL CHR,"0"
CAILE CHR,"9"
GO [ OUTSTR[ASCIZ/ILLEGAL FONT NUMBER: '/]
OUTCHR CHR
OUTSTR[ASCIZ/'
/]↔ GO R1A ]
SUBI CHR,"0"
MOVEM CHR,ESCFNT
GO X1 ]
X2: CALL(PUTCHR,CHR)
GO X1 ]
CAMN CHR,ESC3
GO [ CALL(GETCHR)
CALL(SELFNT,ESCFNT)
CALL(PUTCHR,CHR)
GO R1A ]
CAMN CHR,ESC4
GO [ CALL(GETCHR)
CAIL CHR,"0"
CAILE CHR,"9"
GO [ OUTSTR[ASCIZ/ILLEGAL FONT NUMBER: '/]
OUTCHR CHR
OUTSTR[ASCIZ/'
/]↔ GO R1A ]
SUBI CHR,"0"
MOVEM CHR,XLTFNT
GO R1A ]
CAIE CHR,12
CAIN CHR,15
GO [ SPCHAR: CALL(PUTCHR,CHR)
GO R1A]
CAIE CHR,11
CAIN CHR,40
GO SPCHAR
CAIN CHR,14
GO SPCHAR
MOVEI CNT,5
MOVE PTR,[POINT 7,ACCUM]
SETZ ACCUM,
SETO LAST,
R2: JUMPE CHR,[CALL(GETCHR)↔GO R2]
IDPB CHR,PTR
CALL(SEARCH,ACCUM,[XLTABLE],[XLTSIZ])
GO FAIL
MOVE LAST,1
CALL(GETCHR)
SOJG CNT,R2
FAIL: JUMPL LAST,[SETZ CHR,↔GO FAIL3]
SKIPE XLTVAL(LAST)
GO [ PUSHJ P,OUTWORD
GO R1]
FAIL2: OUTSTR[ASCIZ/UNDEFINED LETTER(S) '/]
SETZ FOO,
DPB FOO,PTR
FAIL3: SKIPN ACCUM
FATAL(INTERNAL CONFUSION)
OUTSTR[ASCIZ/'/]
OUTSTR ACCUM
OUTSTR[ASCIZ/' WILL BE DEFINED AS SAME.
/]
SKIPE XLTABLE(1)
FATAL(OVERWRITE CHECK FOR HASH TABLE)
SKIPE XLTVAL(1)
FATAL(OVERWRITE CHECK FOR HASH TABLE)
MOVEI T1,XLTSIZ-1
S1: CAMN ACCUM,XLTVAL(T1)
GO [ OUTSTR[ASCIZ/ '/]
OUTSTR XLTABL(T1)
OUTSTR[ASCIZ/' IS A ALREADY DEFINED AS '/]
OUTSTR XLTVAL(T1)
OUTSTR[ASCIZ/'
/]
GO S1+2]
SOJGE T1,S1
MOVEM ACCUM,XLTABLE(1)
SETOM ACCUM,XLTVAL(1)
MOVE LAST,1
PUSHJ P,OUTWORD
GO R1
FINISH: SKIPE ACCUM
PUSHJ P,OUTWORD
FIN2: RELEAS INCHAN,
RELEAS OUTCHAN,
CALLI
MOVE JOBFF
CORE
FATAL(CAN'T SHRINK CORE)
OUTSTR[ASCIZ/
FINISHED!
USE FONT#0 FOR TRANSLITERATED CHARACTERS.
USE FONT#1 FOR NORMAL CHARACTERS./]
CALLI 12
OUTWORD: MOVEI CNT,5
MOVE PTR,[POINT 7,XLTVAL(LAST)]
MOVE T1,XLTVAL(LAST)
CAMN T1,[-1]
GO [ MOVE PTR,[POINT 7,XLTABL(LAST)]
CALL(SELFNT,ESCFNT)
CALL(OUTWO1)
POPJ P, ]
CALL(SELFNT,XLTFNT)
OUTWO1: ILDB T1,PTR
JUMPE T1,CPOPJ
CALL(PUTCHR,T1)
SOJG CNT,OUTWO1
CPOPJ: POPJ P,
LOC 124
GO REEADR
RELOC
REEADR: MOVEI 1,XLTSIZ
REEL1: SOJL 1,[CALLI 1,12]
SKIPN XLTABL(1)
GO REEL1
OUTSTR XLTABL(1)
SKIPN T1,XLTVAL(1)
GO [ OUTSTR[ASCIZ/ intermediate /]
GO REEL1 ]
CAMN T1,[-1]
GO [ OUTSTR[ASCIZ/ is undefined /]
GO REEL1 ]
OUTSTR[ASCIZ/→/]
OUTSTR XLTVAL(1)
OUTSTR[ASCIZ/ /]
GO REEL1
NSUBR(GETCHR)INPUT A CHARACTER
GLOBAL CHR
SOSG INCNT
IN INCHAN,
GO[ ILDB CHR,INPTR↔ POP0J]
STATZ INCHAN,IODEND
GO @INEOF
FATAL(READ ERROR)
SUBREND GETCHR
NSUBR(PUTCHR,CHAR)OUTPUT A CHARACTER
SOSG OUTCNT
OUT OUTCHAN,
GO[ EXCH 1,CHAR↔ IDPB 1,OUTPTR↔ EXCH 1,CHAR↔ POP1J]
FATAL(WRITE ERROR)
SUBREND PUTCHR
NSUBR(SELFNT,FNTNUM)
GLOBAL CHR;
EXCH 1,FNTNUM
CAMN 1,CURFNT
GO FNTOK
CALL(PUTCHR,[177])
CALL(PUTCHR,[1])
CALL(PUTCHR,1)
MOVEM 1,CURFNT
FNTOK: EXCH 1,FNTNUM
POP1J
SUBREND SELFNT
NSUBR TVTEST
GLOBAL CHR
IN INCHAN, ;READ FIRST RECORD
SKIPA
FATAL (READ ERROR)
HRRZ 2,INPTR
ADD 2,[XWD 1,1]
MOVSI 1,-4 ;LOOK AT FIRST 4 WORDS
LOOP: MOVE 0,@2
CAME 0,TVSAMP(1)
POP0J
AOBJN 1,LOOP
TVFILE: PUSH P,INEOF
MOVEI TVLOSE
MOVEM INEOF
CALL(GETCHR)
CAIE CHR,14
GO .-2
POP P,INEOF
OUTSTR [ASCIZ/I assumed file was in TVED format.
/]
POP0J
TVSAMP: ASCII/COMMENT ⊗ VALID 00007 PAGES/
; 123456789012345678901234567890
; 1 2 3
; 0 1 2 3 4 5
TVLOSE: FATAL (EOF IN TVED DIRECTORY)
SUBREND TVTEST
NSUBR(GETFIL)GET FILE SPEC FROM TTY LINE
SETZM FILNAM↔SETZM EXTION
SETZM EXTION+1↔SETZM PPPN
; CRLF
MOVE 4,[POINT 6,FILNAM,-1]↔MOVEI 2,6
INCHWL 1↔CAIN 1,15↔GO[INCHWL↔POP0J]↔AOS(P)
JRST L+1
L: INCHWL 1
CAILE 1,"z"↔POP0J
CAIL 1,"a"↔SUBI 1,40 ;CONVERT LOWER CASE
CAIN 1,"."↔GO[MOVE 4,[POINT 6,EXTION,-1]↔MOVEI 2,3↔GO L]
CAIN 1,"["↔GO[MOVE 4,[POINT 6,PPPN,-1] ↔MOVEI 2,3↔GO L]
CAIN 1,","↔GO[HLRZ PPPN
PUSHJ P,[PPJUST: JUMPE [OUTSTR[ASCIZ/BAD P,PN/]
CLRBFI↔SOS -1(P)↔CRLF↔POP1J]
TRNE 77↔POP0J↔LSH -6↔GO PPJUST]
HRLM PPPN↔MOVE 4,[POINT 6,PPPN,17]↔MOVEI 2,3↔GO L]
CAIN 1,"]"↔GO[HRRZ PPPN↔CALL(PPJUST)
HRRM PPPN↔INCHWL 1↔GO FINQ]
FINQ: CAIN 1,15↔GO EOL ;END OF THE LINE.
CAIN 1,12↔POP0J
CAIN 1,"→"↔POP0J
CAIG 1," "↔GO L ;IGNORE GARBAGE.
SOJL 2,L↔SUBI 1,40↔IDPB 1,4↔GO L
EOL: INCHWL 1↔POP0J
SUBREND;1/31/73(BGB),2/7/73(TVR)
NSUBR(SEARCH,KEY,TABLE,SIZE)SEARCH HASH TABLE
GLOBAL ACCUM,T1,T2,FOO
HRLI FOO,T2
HRR FOO,TABLE
MOVE ACCUM,KEY
MOVM T1,ACCUM
IDIV T1,SIZE
SETZM LOSE#
L2: CAMN ACCUM,@FOO
GO [ MOVE 1,T2↔ AOS(P)↔ POP3J]
SKIPE T1,@FOO
SOJGE T2,L2
JUMPE T1,[MOVE 1,T2↔ POP3J]
SKIPE LOSE
FATAL(HASH TABLE FULL)
SETOM LOSE
MOVE T2,SIZE
SOJA T2,L2
SUBREND
;DATA AREA
FROMLI: BLOCK 2
TOLIT: BLOCK 2
ESC1: 0
ESC2: 0
ESC3: 0
ESC4: 0
CURFNT: 0
XLTFNT: 0
ESCFNT: 0
INHDR: 0
INPTR: 0
INCNT: 0
INEOF: HALT .
OUTHDR: 0
OUTPTR: 0
OUTCNT: 0
FILNAM: 0
EXTION: 0
0
PPPN: 0
XLTABL: BLOCK XLTSIZ
XLTVAL: BLOCK XLTSIZ
XLTEND←←.-1
PATCH: BLOCK 20
PDL: BLOCK 10
PLEN←←.-PDL
END START